#include "EnsembleCompetencesClasse.h"

using namespace std;

/**
 * Constructeur par défaut. Crée un ensemble anonyme, sans coût ni
 * membres.
 */
EnsembleCompetencesClasse::EnsembleCompetencesClasse()
  : CompetenceClasse( "", 0, "EnsembleCompetencesClasse" ),
    NumeroPrerequis( 0 ), NumeroRacesAdmises( 0 ),
    ChoixPrealable( false )
{}

/**
 * Constructeur standard, qui initialise une instance qui ne possède
 * aucune restrictions quant aux modifications que l'on peut apporter
 * à la sélections des compétences de classe.
 *
 * @param[in] nom nom de l'ensemble.
 * @param[in] prix coût de l'ensemble.
 * @param[in] membres liste des compétences incluses dans l'ensemble.
 * @param[in] numRaces indice des races admises pour l'ensemble.
 * @param[in] numPrerequis indice des prérequis pour l'ensemble.
 * @param[in] oblig force la sélection d'un ensemble lors de la
 * création si \e true.
 */
EnsembleCompetencesClasse::EnsembleCompetencesClasse
( const string& nom, const unsigned& prix, const vector< unsigned >& membres,
  const unsigned& numRaces, const unsigned& numPrerequis, const bool& oblig )
  : CompetenceClasse( nom, prix, "EnsembleCompetencesClasse" ),
    NumeroPrerequis( numPrerequis ), NumeroRacesAdmises( numRaces ),
    ChoixPrealable( oblig )
{
  Membres.assign( membres.begin(), membres.end() );
}

/**
 * Constructeur permettant de limiter (partiellement ou totalement)
 * les modifications postérieures à la sélection de l'ensemble de
 * compétences.
 *
 * @param[in] nom nom de l'ensemble.
 * @param[in] prix coût de l'ensemble.
 * @param[in] membres liste des compétencess incluses dans l'ensemble.
 * @param[in] exclus liste des compétences dont l'état n'est plus
 * modifiable une fois la sélection effectuée.
 * @param[in] numRaces indice des races admises pour l'ensemble.
 * @param[in] numPrerequis indice des prérequis pour l'ensemble.
 * @param[in] oblig force la sélection d'un ensemble lors de la
 * création si \e true.
 */
EnsembleCompetencesClasse::EnsembleCompetencesClasse
( const string& nom, const unsigned& prix, const vector< unsigned >& membres,
  const vector< unsigned >& exclus, const unsigned& numRaces,
  const unsigned& numPrerequis, const bool& oblig )
  : CompetenceClasse( nom, prix, "EnsembleCompetencesClasse" ),
    NumeroPrerequis( numPrerequis ), NumeroRacesAdmises( numRaces ),
    ChoixPrealable( oblig )
{
  Membres.assign( membres.begin(), membres.end() );
  Exclus.assign( exclus.begin(), exclus.end() );
}

/**
 * Constructeur de copie, permet de dupliquer une instance.
 *
 * @param[in] lsEnsComp instance à copier.
 */
EnsembleCompetencesClasse::EnsembleCompetencesClasse
( const EnsembleCompetencesClasse& lsEnsComp )
  : CompetenceClasse( lsEnsComp ),
    NumeroPrerequis( lsEnsComp.numeroPrerequis() ),
    NumeroRacesAdmises( lsEnsComp.numeroRacesAdmises() ),
    ChoixPrealable( lsEnsComp.choixPrealable() )
{
  Membres.assign( lsEnsComp.Membres.begin(), lsEnsComp.Membres.end() );
  Exclus.assign( lsEnsComp.Exclus.begin(), lsEnsComp.Exclus.end() ); 
}

/**
 * Le destructeur n'a rien de spécial à faire.
 */
EnsembleCompetencesClasse::~EnsembleCompetencesClasse()
{}

/**
 * Opérateur d'affectation, permet de copier une instance dans une
 * autre.
 *
 * @param[in] lsEnsComp instance à copier.
 *
 * @return une référence constance sur l'instance courante.
 */
const EnsembleCompetencesClasse& EnsembleCompetencesClasse::operator=
( const EnsembleCompetencesClasse& lsEnsComp )
{
  Nom  = lsEnsComp.nom();
  Prix = lsEnsComp.prix();
  Membres.assign( lsEnsComp.membres() -> begin(),
		  lsEnsComp.membres() -> end() );
  Exclus.assign( lsEnsComp.exclus() -> begin(), lsEnsComp.exclus() -> end() );
  NumeroPrerequis    = lsEnsComp.numeroPrerequis();
  NumeroRacesAdmises = lsEnsComp.numeroRacesAdmises();
  ChoixPrealable     = lsEnsComp.choixPrealable();

  return *this;
}

/**
 * Permet de récupérer un pointeur sur la liste des compétences
 * incluses.
 *
 * @return un pointeur sur Membres.
 */
const vector< unsigned >* EnsembleCompetencesClasse::membres() const
{
  return &Membres;
}

/**
 * Permet de récupérer un pointeur sur la liste des compétences
 * "gelées".
 *
 * @return un pointeur sur Exclus.
 */
const vector< unsigned >* EnsembleCompetencesClasse::exclus() const
{
  return &Exclus;
}

/**
 * Permet de récupérer le numéro d'ensembles de prérequis à appliquer.
 *
 * @return une référence constance sur NumeroPrerequis.
 */
const unsigned& EnsembleCompetencesClasse::numeroPrerequis() const
{
  return NumeroPrerequis;
}

/**
 * Permet de récupérer le numéro d'ensembles de races admises.
 *
 * @return une référence constance sur NumeroRacesAdmises.
 */
const unsigned& EnsembleCompetencesClasse::numeroRacesAdmises() const
{
  return NumeroRacesAdmises;
}

/**
 * Permet de savoir si le choix d'un ensemble est obligatoire (comme
 * pour les spécialistes) ou optionnel.
 *
 * @return \e true si le choix est obligatoire, \e false sinon.
 */
const bool& EnsembleCompetencesClasse::choixPrealable() const
{
  return ChoixPrealable;
}
